import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { map, Observable } from 'rxjs';

@Injectable()
export class SerializeInterceptor implements NestInterceptor {

  constructor(private dto: any, private flag?: boolean) {
    this.flag = flag;
  }

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('这里是拦截器执行之前');
    
    return next.handle().pipe(map(data => {
      console.log('这里是拦截器执行之后');

      return plainToInstance(this.dto, data, {
        // 设置了true之后，所有经过该拦截器的接口都需要配置Expose或者Exclude的class类属性
        // 如果不设置，则默认是false，即所有的属性都可以被序列化
        // Expose -> 需要暴露的属性
        // Exclude -> 需要排除的属性(不暴露)
        excludeExtraneousValues: this.flag,
        // 对属性进行隐性类型转换
        // 例如：前端传递过来的字符串类型的数据，如果在dto中定义的是number类型，那么就会自动转换为number类型
        enableImplicitConversion: true
      })
    }));
  }
}
